home *** CD-ROM | disk | FTP | other *** search
/ Personal Paint v7.1 / Cloanto Personal Paint v7.1.iso / rexx / animcharpath.pprx < prev    next >
Text File  |  1997-05-06  |  64KB  |  2,078 lines

  1. /* Personal Paint Amiga Rexx script - Copyright ⌐ 1997 Cloanto Italia srl */
  2.  
  3. /* $VER: AnimCharPath.pprx 1.1 */
  4.  
  5. /** ENG
  6.  This script can be used to easily create animations with
  7.  moving and transforming characters (vector fonts).
  8.  
  9.  The main requester gives access to the following commands:
  10.  
  11.  - New: the path is cleared and the character settings are restored
  12.    to their default values.
  13.  
  14.  - Load: an existing path file can be selected using the file requester;
  15.    this causes the path coordinates, the brush transformation settings
  16.    and the animation settings to be loaded (note: this data
  17.    is stored in ASCII format and can easily be algorithmically
  18.    generated and manipulated by other programs).
  19.  
  20.  - Save: this command writes a path file using the current path data.
  21.  
  22.  - Define Freehand: the mouse can be used to "draw" the path;
  23.    both the direction of the path and the mouse movement speed
  24.    affect the resulting animation: the original direction
  25.    is used to render the frames (the starting point is used
  26.    to place the object in the first frame and the last point
  27.    is used for the last frame) and the drawing speed
  28.    affects the number and the "density" of stored points
  29.    (the slower the speed, the more points, and
  30.    vice versa) and defines the perceived speed of the animation
  31.    (e.g. a path defined with a high initial speed and a slow
  32.    ending speed leads to a corresponding animation).
  33.    Before the mouse button is pressed, the character is displayed
  34.    to ease positioning in the first frame.
  35.  
  36.  - Define Linear: the mouse can be used to define a linear path
  37.    (simply consisting of a starting point and an ending point);
  38.    unlike the freehand path, this kind of path produces a
  39.    constant-speed animation (equally-spaced intermediate points
  40.    are generated automatically).
  41.  
  42.  - Edit: this command can be used to visually edit the path;
  43.    the "path points" can be dragged with the mouse to change the
  44.    path shape and/or density (speed); the <m> key toggles
  45.    the magnify mode on or off, and the right mouse button or the <Esc> key
  46.    can be pressed to leave the editing mode.
  47.  
  48.  - Move and Resize: the mouse can be used to resize the animation
  49.    path (clicking on the lower right part of the path) or to drag it
  50.    to a new position (clicking on the upper part). This is useful
  51.    to create paths with point outside the screen, which cannot be
  52.    drawn by hand. The <m> key toggles the magnify mode on or off, and
  53.    the right mouse button or the <Esc> key can be pressed
  54.    to exit from the move and resize mode.
  55.  
  56.  - Character: the character requester can be used to select the
  57.    font to be used (the "Vector Font Path Selection" macro must be
  58.    run to select a font path other than "FONTS:"), the character,
  59.    its (initial) size, the handle position ("Base Left", "Base Center",
  60.    "Center") and the antialias level ("None", "Low", "Medium", "High").
  61.  
  62.  - Character Angle: the Character Angle requester is used to set
  63.    the number of character rotations ("Rotation Cycles"), the starting
  64.    ("From Angle") and ending angle ("To Angle"), and the
  65.    rotation direction ("Direction": "Clockwise/Counterclockwise");
  66.    a number of rotations greater than 1 can be used to add
  67.    additional 360░ spins in the specified direction.
  68.  
  69.  - Character Shear: the Character Shear requester is used to set
  70.    the number of shear cycles ("Shear Cycles"), and the starting and
  71.    ending shear level ("From Angle", "To Angle"); if a number of
  72.    shear cycles greather than 1 is specified,
  73.    the shear factors will move back and forth within the specified
  74.    limits (an odd number of cycles must be used to reach the ending
  75.    shear in the last frame).
  76.  
  77.  - Character Boldness: the Character Boldness requester is used to set
  78.    the number of boldness cycles, the starting and
  79.    ending horizontal boldness level ("From Horizontal" and "To Horizontal"),
  80.    and the starting and ending vertical boldness ("From Vertical" and
  81.    "To Vertical"); if a number of cycles greather than 1
  82.    is specified, the boldness levels will move back and forth within
  83.    the specified limits (an odd number of cycles must be used to reach
  84.    the ending boldness in the last frame).
  85.  
  86.  - Character Size: the Character Size requester is used to set
  87.    the number of resize cycles ("Resize Cycles"), and the starting and
  88.    ending size ("From" and "To", in percentage of the initial size);
  89.    if a number of resize cycles greather than 1 is specified,
  90.    the resize factor will move back and forth within the specified
  91.    limits (an odd number of cycles must be used to reach the ending
  92.    size in the last frame).
  93.  
  94.  - Data: the Data requester is used to view all path information
  95.    at a glance (animation, character, rotation, shear, boldness
  96.    and resize settings, followed by the path coordinates).
  97.  
  98.  - Preview: this command is used to preview the animation (no antialiasing
  99.    is applied in preview mode).
  100.  
  101.  The main requester also contains gadgets to set the animation
  102.  frames ("Count"), the recording direction ("Direction":
  103.  "Forward/Backward/Still" - the frame step) and the frame insertion option
  104.  ("Add Frames" - if active, "Count" frames are inserted).
  105.  
  106.  When using freehand paths with no character effect, the "Count"
  107.  setting should not be set to a number greater than the path points
  108.  (as reported by the Data requester), as this would generate one or more
  109.  duplicate frames.
  110.  
  111.  The bottom gadgets in the main requester can be used to render
  112.  the animation ("Draw", which also terminates the script) or to
  113.  quit the script ("Quit"). A copy of the current path is
  114.  always temporarily stored, so that it can be used when the script is
  115.  run again.
  116. */
  117.  
  118. /** DEU
  119.  Dieses Skript erm÷glicht die einfache Erzeugung von Animationen, in deren
  120.  Verlauf Schriftzeichen aus Vektorfonts bewegt und verwandelt werden.
  121.  
  122.  Im Haupt-Dialogfenster erfolgt der Zugriff auf folgende Befehle:
  123.  
  124.  - Neu: L÷scht den alten Pfad und setzt die Zeicheneinstellungen auf ihre
  125.    Standardwerte zurⁿck.
  126.  
  127.  - Laden: Mit dem Dateiauswahlfenster lΣ▀t sich eine zurvor gespeicherte
  128.    Pfaddatei auswΣhlen. Dabei werden Pfadkoordinaten, Einstellungen fⁿr die
  129.    Pinseltransformation und verschiedene Animationseinstellungen geladen.
  130.    Hinweis: Diese Daten liegen im ASCII-Format vor und lassen sich daher auf
  131.    einfache Weise mit Hilfe anderer Programme algorithmisch erzeugen und/oder
  132.    verΣndern.
  133.  
  134.  - Speichern: Schreibt eine Pfaddatei unter Verwendung der aktuellen
  135.    Pfaddaten.
  136.  
  137.  - Frei festlegen: Erm÷glicht die Bestimmung des Pfades mit Hilfe der Maus.
  138.    Sowohl dessen Verlauf als auch die Geschwindigkeit der Mausbewegung
  139.    beeinflussen den spΣteren Animationsablauf: Die ursprⁿngliche Richtung wird
  140.    zur Berechnung der Einzelbilder verwendet (Das erste Einzelbild wird am
  141.    Startpunkt berechnet, das letzte dementsprechend am Zielpunkt), wΣhrend die
  142.    Geschwindigkeit des Zeichenvorgangs sowohl Anzahl als auch Abstand
  143.    ("Dichte") der gespeicherten Punkte beeinflu▀t. Dabei gilt: Je geringer die
  144.    Geschwindigkeit, desto mehr Punkte, und umgekehrt. Auch die
  145.    Ablaufgeschwindigkeit hΣngt von diesem Faktor ab, d. h. ein mit hoher
  146.    Anfangs- und geringer Endgeschwindigkeit definierter Pfad erzeugt eine
  147.    dementsprechend mit zunehmend geringerer Geschwindigkeit ablaufende
  148.    Animation. Um die Festlegung der Position fⁿr das erste Einzelbild zu
  149.    erleichtern, wird vor der BetΣtigung der linken Maustaste das aktuelle
  150.    Zeichen angezeigt.
  151.  
  152.  - Linear festlegen: Erm÷glicht die Bestimmung eines linearen Pfades,
  153.    welcher lediglich durch Anfangs- und Endpunkt festgelegt wird. Im Gegensatz
  154.    zum frei festgelegten Pfad wird hierdurch eine Animation erzeugt, die ⁿber
  155.    ihren gesamten Verlauf hinweg eine konstante Geschwindigkeit beibehΣlt, da
  156.    die Zwischenpunkte automatisch alle im gleichen Abstand voneinander
  157.    angeordnet werden.
  158.  
  159.  - Bearbeiten: Dient zur visuellen Bearbeitung des Pfades. Durch Verschieben
  160.    der einzelnen Knotenpunkte des Pfades mit der Maus lassen sich Form und
  161.    Dichte (Geschwindigkeit) Σndern. Mit Hilfe der Taste <m> lΣ▀t sich die
  162.    Lupenfunktion an- oder ausschalten. Um den Bearbeitungsmodus zu verlassen,
  163.    ist die <Esc>-Taste zu drⁿcken.
  164.  
  165.  - Position und Gr÷▀e: Hiermit lassen sich unter Verwendung der Maus
  166.    Position (durch Anklicken des rechten unteren Pfadteils) und Gr÷▀e (durch
  167.    Anklicken des oberen Teils) des Animationspfades Σndern. Dies eignet sich
  168.    besonders zur Erzeugung von Animationspfaden, die aus dem sichtbaren Bereich
  169.    hinauslaufen, da sich diese nicht von Hand zeichnen lassen. Mit <m> lΣ▀t
  170.    sich jederzeit die Lupe an- oder ausschalten, und mit <Esc> wird der Modus
  171.    "Position und Gr÷▀e" verlassen.
  172.  
  173.  - Zeichen: In diesem Zeichenauswahl-Dialogfenster werden der gewⁿnschte
  174.    Font, das Zeichen, dessen Anfangsgr÷▀e, die Griffpunktposition "Basis
  175.    Links", "Basis Mitte", "Mitte" und der Grad der KantenglΣttung "Keine",
  176.    "Gering", "Mittel", "Hoch") eingestellt. Hinweis: Um einen anderen Fontpfad
  177.    als "FONTS:" zu wΣhlen, mu▀ zuvor das Makro "Vektorfont-Pfadauswahl"
  178.    ausgefⁿhrt werden.
  179.  
  180.  - Zeichen drehen: In diesem Dialogfenster werden die Anzahl der Umdrehungen
  181.    ("Umdrehungen"), der Startwinkel ("Startwinkel"), der Zielwinkel
  182.    ("Zielwinkel") und der Drehsinn ("Drehsinn "Rechts herum/Links herum"
  183.    festgelegt; durch die Angabe eines Wertes > 1 lassen sich zusΣtzliche volle
  184.    Umdrehungen erzeugen.
  185.  
  186.  - Zeichen kippen: In diesem Dialogfenster werden die Anzahl der
  187.    KippdurchlΣufe ("DurchlΣufe") und der Anfangs- und Endwinkel des
  188.    Kippvorgangs ("Von Winkel", "Bis Winkel") festgelegt; durch die Angabe eines
  189.    Kipp-Wertes > 1 pendeln die Kippwerte zwischen den angegebenen Grenzwerten
  190.    hin und her. Hinweis: Um den Kipp-Endwert beim letzten Einzelbild zu
  191.    erreichen, mu▀ eine gerade Anzahl von DurchlΣufen angegeben werden.
  192.  
  193.  - Zeichendicke: In diesem Dialogfenster werden die Anzahl der DurchlΣufe,
  194.    der Start- und Endwert fⁿr die horizontale Zeichendicke ("Von Horizontal"
  195.    und "Bis Horizontal") und der Start- und Endwert fⁿr die vertikale
  196.    Zeichendicke ("Von Vertikal") und ("Bis Vertikal") festgelegt. Wenn mehr als
  197.    ein Durchlauf festgelegt wird, pendeln die Dickewerte zwischen den beiden
  198.    Grenzwerten hin und her. Hinweis: Um den Dicke-Endwert beim letzten
  199.    Einzelbild zu erreichen, mu▀ eine gerade Anzahl von DurchlΣufen angegeben
  200.    werden.
  201.  
  202.  - Zeichengr÷▀e: Dieses Dialogfenster dient zum Einstellen der
  203.    ─nderungsdurchlΣufe fⁿr die Zeichengr÷▀e ("DurchlΣufe"), der Start- und
  204.    Zielgr÷▀e ("Von" und "Bis" in Prozent der ursprⁿnglichen Gr÷▀e); wenn mehr
  205.    als ein Durchlauf festgelegt wird, pendelt der Wert fⁿr fⁿr die
  206.    Gr÷▀enΣnderung zwischen den angegebenen Grenzwerten hin und her. Hinweis: Um
  207.    den Endwert beim letzten Einzelbild zu erreichen, mu▀ eine gerade Anzahl von
  208.    DurchlΣufen angegeben werden.
  209.  
  210.  - Im Daten-Dialogfenster werden alle Pfadinformationen auf einen Blick
  211.    dargestellt: Animation, Zeichen, Umdrehung, Kippwerte, Dicke,
  212.    Gr÷▀eneinstellungen und Pfadkoordinaten.
  213.  
  214.  - Vorschau: Mit diesem Befehl lΣ▀t sich eine Vorschau der Animation
  215.    betrachten. Im Vorschaumodus wird keine KantenglΣttung angewendet.
  216.  
  217.  - Das Haupt-Dialogfenster enthΣlt daneben auch Funktionen zum Festlegen der
  218.    Einzelbilder einer Animation ("ZΣhler"), der Aufzeichnungsrichtung
  219.    ("Richtung": "VorwΣrts/RⁿckwΣrts/Stillstand" - die Schrittweite) und zum
  220.    Einfⁿgen von Einzelbildern ("Bilder add." - wenn aktiviert, werden unter
  221.    "ZΣhler" Bilder hinzugefⁿgt).
  222.  
  223.  Bei der Verwendung eines frei festgelegten Pfades ohne einen Pinseleffekt
  224.  sollte der "ZΣhler"-Wert die Anzahl der Knotenpunkte des Pfades (wie im
  225.  Daten-Dialogfenster angezeigt) nicht ⁿberschreiten, da dies zur Duplizierung
  226.  eines oder mehrerer Einzelbilder fⁿhren wⁿrde.
  227.  
  228.  Die unteren Funktionselemente im Haupt-Dialogfenster dienen zum Erzeugen der
  229.  Animation ("Zeichnen", dient auch zum Abbrechen des Skripts) und zum Beenden
  230.  des Skripts ("Verlassen"). Es wird immer eine temporΣre Kopie des aktuellen
  231.  Pfades gespeichert, die bei einem erneuten Start des aktuellen Skripts
  232.  geladen wird.
  233.  
  234. */
  235.  
  236. /** ITA
  237.  Si pu≥ usare questo script per creare facilmente animazioni con caratteri
  238.  che si muovono e trasformano (font vettoriali).
  239.  
  240.  La finestra di dialogo principale mette a disposizione i seguenti comandi:
  241.  
  242.  - Nuovo: il percorso Φ cancellato e le impostazioni del carattere
  243.    sono riportate ai loro valori predefiniti.
  244.  
  245.  - Leggere: si pu≥ scegliere un file di percorso giα esistente tramite la
  246.    finestra di scelta file; ci≥ comporta il caricamento delle coordinate del
  247.    percorso, delle impostazioni di trasformazione del pennello e di quelle
  248.    relative all'animazione (nota: tali dati sono immagazzinati in formato
  249.    ASCII e possono essere facilmente generati tramite algoritmi nonchΘ
  250.    manipolati da altri programmi).
  251.  
  252.  - Scrivere: Questo comando salva un file di percorso usando i dato del percorso
  253.    corrente.
  254.  
  255.  - Definire a mano libera: si pu≥ usare il mouse per "tracciare" il percorso;
  256.    l'animazione risultante Φ influenzata sia dalla direzione del percorso sia
  257.    dalla velocitα di spostamento del mouse: la direzione originale Φ usata
  258.    per disegnare i fotogrammi (il punto di partenza Φ utilizzato per piazzare
  259.    l'oggetto nel primo fotogramma e l'ultimo punto Φ usato per il fotogramma
  260.    finale) mentre la velocitα del tracciamento influenza il numero e la
  261.    "densitα" dei punti memorizzati (tanto Φ pi∙ lenta la velocitα, tanto
  262.    maggiore il numero dei punti, e viceversa) e definisce la velocitα
  263.    percepita dell'animazione (es. un percorso definito con una alta velocitα
  264.    iniziale ed una bassa velocitα finale porta ad una animazione con
  265.    caratteristiche corrispondenti).
  266.    Prima di premere il pulsante del mouse, si visualizza il carattere per
  267.    facilitare il posizionamento del primo fotogramma.
  268.  
  269.  - Definire lineare: si pu≥ usare il mouse per definire un percorso lineare
  270.    (che consiste semplicemente di un punto di partenza e uno d'arrivo);
  271.    a differenza del percorso a mano libera, questo tipo di percorso produce
  272.    una animazione a velocitα costante (i punti intermedi sono generati in modo
  273.    automatico a distanze tra loro eguali).
  274.  
  275.  - Modificare: si pu≥ usare questo comando per modificare in modo
  276.    visivo il percorso; i "punti del percorso" possono essere spostati col
  277.    mouse per cambiare la forma del percorso e/o la densitα (velocitα); il
  278.    tasto <m> attiva/disattiva l'ingrandimento, ed il tasto destro del mouse
  279.    o il tasto <Esc> possono essere premuti per uscire dalla modalitα di
  280.    modifica percorso.
  281.  
  282.  - Spostare e ridimensionare: si pu≥ usare il mouse per ridimensionare il
  283.    percorso dell'animazione (facendo click sulla parte inferiore destra dello
  284.    stesso) o spostarlo in una nuova posizione (facendo click sulla parte
  285.    superiore). Ci≥ Φ utile per creare percorsi con punti all'esterno dello
  286.    schermo, che non si possono piazzare manualmente. Il tasto <m>
  287.    attiva/disattiva l'ingrandimento, ed il tasto destro del mouse o il tasto
  288.    <Esc> possono essere premuti per uscire dalla modalitα di spostamento e
  289.    ridimensionamento.
  290.  
  291.  - Carattere: si pu≥ usare la finestra di selezione caratteri per scegliere
  292.    il font da usare (si deve lanciare la macro "VectorFontPath.pprx"
  293.    per scegliere un percorso font diverso da "FONTS:"), il carattere,
  294.    il suo (iniziale) corpo, la posizione della maniglia di ridimensionamento
  295.    ("Base sinistra", "Base centro", "Centro") e il livello di smorzamento
  296.    seghettature - o antialias ("Nessuno", "Basso", "Medio", "Alto").
  297.  
  298.  - Angolo carattere: si usa la finestra di dialogo Angolo carattere
  299.    per impostare il numero di rotazioni del carattere ("Cicli rotazione"),
  300.    l'angolo iniziale ("Da angolo") e finale ("Ad angolo"), e la direzione
  301.    della rotazione ("Senso": "Orario/Antiorario"); si pu≥ usare un numero di
  302.    rotazioni maggiore di 1 per aggiungere ulteriori avvitamenti a 360░ nella
  303.    direzione specificata.
  304.  
  305.  - Inclinazione carattere: si usa la finestra di dialogo Inclinazione carattere
  306.    per impostare il numero di cicli di inclinazione ("Cicli inclinazione"), e
  307.    il livello di inclinazione iniziale e finale ("Da angolo", "Ad angolo");
  308.    se si specifica un numero di cicli di inclinazione maggiore di 1, i fattori
  309.    di inclinazione si muoveranno avanti ed indietro entro i limiti specificati
  310.    (si deve usare un numero dispari di cicli per raggiungere l'inclinazione
  311.    finale nell'ultimo fotogramma).
  312.  
  313.  - Spessore carattere: si usa la finestra di dialogo Spessore carattere per
  314.    impostare il numero di cicli di spessore, il livello iniziale e finale di
  315.    spessore orizzontale ("Da orizzontale" e "A orizzontale"), lo spessore
  316.    verticale iniziale e finale ("Da verticale" e "A verticale"); se si
  317.    specifica un numero di cicli maggiore di 1, i livelli di spessore si
  318.    muoveranno avanti ed indietro entro i limiti specificati (si deve usare un
  319.    numero dispari di cicli per raggiungerelo spessore finale nell'ultimo
  320.    fotogramma).
  321.  
  322.  - Dimensioni carattere: si usa la finestra di dialogo Dimensioni carattere per
  323.    impostare il numero di cicli di ridimensionamento ("Cicli
  324.    ridimensionamento"), e la dimensione iniziale e finale ("Da" e "A", in
  325.    percentuale della dimensione iniziale); se si specifica un numero di cicli
  326.    di ridimensionamento maggiore di 1, il fattore di ridimensionamento si
  327.    muoverα avanti ed indietro entro i limiti specificati (si deve usare un
  328.    numero dispari di cicli per raggiungere la dimensione finale nell'ultimo
  329.    fotogramma).
  330.  
  331.  - Dati: si usa la finestra di dialogo Dati percorso per vedere tutte
  332.    le informazioni relative al percorso con un solo colpo d'occhio
  333.    (impostazioni per animazione, carattere, rotazione, inclinazione, spessore,
  334.    ridimensionamento, seguite dalle coordinate del percorso).
  335.  
  336.  - Anteprima: si usa questo comando per vedere una anteprima dell'animazione
  337.    (nella modalitα di anteprima non Φ attivato lo smorzamento seghettature).
  338.  
  339.  La finestra principale contiene anche pulsanti per impostare il numero di
  340.  fotogrammi dell'animazione ("Passi"), la direzione di registrazione
  341.  ("Direzione": "Avanti/Indietro/Fermo" - il passo fotogramma) e l'opzione per
  342.  l'inserimento di fotogrammi ("Aggiunta fotogrammi" - se Φ attiva, saranno
  343.  inseriti tanti fotogrammi quanti indicato da "Passi").
  344.  
  345.  Quando si usano percorsi a mano libera senza effetti sul carattere, il numero
  346.  specificato in "Passi" non dovrebbe essere maggiore del numero di punti del
  347.  percorso (come riferito dalla finestra di dialogo Dati percorso), perchΘ in
  348.  questo modo si otterrebbero uno o pi∙ fotogrammi doppi.
  349.  
  350.  Si possono usare i pulsanti sulla parte inferiore della finestra di dialogo
  351.  principale per realizzare l'animazione ("Animare", che inoltre fa terminare
  352.  lo script) o per uscire dallo script ("Uscire"). Una copia del percorso
  353.  corrente Φ sempre immagazzinata temporaneamente, perchΘ sia possibile usarla
  354.  quando si avvia nuovamente lo script.
  355. */
  356.  
  357. IF ARG(1, EXISTS) THEN
  358.     PARSE ARG PPPORT
  359. ELSE
  360.     PPPORT = 'PPAINT'
  361.  
  362. IF ~SHOW('P', PPPORT) THEN DO
  363.     IF EXISTS('PPaint:PPaint') THEN DO
  364.         ADDRESS COMMAND 'Run >NIL: PPaint:PPaint'
  365.         DO 30 WHILE ~SHOW('P',PPPORT)
  366.              ADDRESS COMMAND 'Wait >NIL: 1 SEC'
  367.         END
  368.     END
  369.     ELSE DO
  370.         SAY "Personal Paint could not be loaded."
  371.         EXIT 10
  372.     END
  373. END
  374.  
  375. IF ~SHOW('P', PPPORT) THEN DO
  376.     SAY 'Personal Paint Rexx port could not be opened'
  377.     EXIT 10
  378. END
  379.  
  380. ADDRESS VALUE PPPORT
  381. OPTIONS RESULTS
  382. OPTIONS FAILAT 10000
  383.  
  384. Get 'LANG'
  385. IF RESULT = 1 THEN DO        /* Deutsch */
  386.         global.txt_title_menu  = 'AnimZeichen-Pfad'
  387.         global.txt_title_new   = 'Neuer Animationspfad'
  388.         global.txt_title_load  = 'Animationspfad laden'
  389.         global.txt_title_save  = 'Animationspfad speichern'
  390.         global.txt_title_fhand = 'Pfad frei festlegen'
  391.         global.txt_title_line  = 'Pfad linear festlegen'
  392.         global.txt_title_edit  = 'Animationspfad bearbeiten'
  393.         global.txt_title_movrs = 'Pfadposition/Gr÷▀e Σndern'
  394.         global.txt_title_char  = 'Zeichen'
  395.         global.txt_title_crot  = 'Zeichen drehenl'
  396.         global.txt_title_cshr  = 'Zeichen kippen'
  397.         global.txt_title_cbold = 'Zeichendicke'
  398.         global.txt_title_cresz = 'Zeichengr÷▀e'
  399.         global.txt_title_pview = 'Pfadvorschau'
  400.         global.txt_title_draw  = 'Animation zeichnen'
  401.         global.txt_title_data  = 'Pfadinformationen'
  402.  
  403.         global.txt_menu_new    = 'Neu'
  404.         global.txt_menu_load   = 'Laden...'
  405.         global.txt_menu_save   = 'Speichern...'
  406.         global.txt_menu_fhand  = 'Frei festlegen'
  407.         global.txt_menu_line   = 'Linear festlegen'
  408.         global.txt_menu_edit   = 'Bearbeiten'
  409.         global.txt_menu_movrs  = 'Position/Gr÷▀e'
  410.         global.txt_menu_char   = 'Zeichen...'
  411.         global.txt_menu_crot   = 'Zeichen drehen...'
  412.         global.txt_menu_cshr   = 'Zeichen kippen...'
  413.         global.txt_menu_cbold  = 'Zeichendicke...'
  414.         global.txt_menu_cresz  = 'Zeichengr÷▀e...'
  415.         global.txt_menu_data   = 'Informationen...'
  416.         global.txt_menu_prview = 'Vorschau'
  417.  
  418.         global.txt_gad_count   = 'Z_Σhler:'
  419.         global.txt_gad_add     = '_Frames add.:'
  420.         global.txt_gad_noyes.0 = 'Nein'
  421.         global.txt_gad_noyes.1 = 'Ja'
  422.         global.txt_gad_direct  = '_Richtung:'
  423.         global.txt_gad_dirct.0 = 'VorwΣrts'
  424.         global.txt_gad_dirct.1 = 'RⁿckwΣrts'
  425.         global.txt_gad_dirct.2 = 'Stillstand'
  426.         global.txt_gad_draw    = '_Zeichnen'
  427.         global.txt_gad_quit    = '_Verlassen'
  428.         global.txt_gad_font    = '_Font:'
  429.         global.txt_gad_char    = 'Zeiche_n:'
  430.         global.txt_gad_size    = '_Gr÷▀e:'
  431.         global.txt_gad_handle  = 'G_riffpunkt:'
  432.         global.txt_gad_aalias  = '_KantenglΣttung:'
  433.         global.txt_gad_aals.0  = 'Keine'
  434.         global.txt_gad_aals.1  = 'Gering'
  435.         global.txt_gad_aals.2  = 'Mittel'
  436.         global.txt_gad_aals.3  = 'Hoch'
  437.         global.txt_gad_handl.0 = 'Basis links'
  438.         global.txt_gad_handl.1 = 'Basis Mitte'
  439.         global.txt_gad_handl.2 = 'Mitte'
  440.         global.txt_gad_rotats  = '_Umdrehungen:'
  441.         global.txt_gad_fromang = '_Startwinkel:'
  442.         global.txt_gad_toang   = '_Zielwinkel:'
  443.         global.txt_gad_rotdir  = '_Richtung:'
  444.         global.txt_gad_rotdr.0 = 'Rechts herum'
  445.         global.txt_gad_rotdr.1 = 'Links herum'
  446.         global.txt_gad_shears  = '_DurchlΣufe:'
  447.         global.txt_gad_fromsh  = '_Von Winkel:'
  448.         global.txt_gad_tosh    = '_Bis Winkel:'
  449.         global.txt_gad_resizes = '_DurchlΣufe:'
  450.         global.txt_gad_fromrs  = '_Von (%):'
  451.         global.txt_gad_tors    = '_Bis (%):'
  452.         global.txt_gad_bolds   = '_DurchlΣufe:'
  453.         global.txt_gad_frombdx = '_Von Horizontal:'
  454.         global.txt_gad_tobdx   = '_Bis Horizontal:'
  455.         global.txt_gad_frombdy = 'V_on Vertikal:'
  456.         global.txt_gad_tobdy   = 'B_is Vertikal:'
  457.         global.txt_msg_points  = 'Punkte:'
  458.         global.txt_msg_ptype.0 = '(Freier Pfad)'
  459.         global.txt_msg_ptype.1 = '(Linearer Pfad)'
  460.  
  461.         global.txt_err_oldcl   = 'Dieses Skript erfordert eine neuere_Version von Personal Paint'
  462.         global.txt_err_lost    = 'Pfaddaten gehen verloren'
  463.         global.txt_err_load    = 'Pfaddatei kann nicht ge÷ffnet werden'
  464.         global.txt_err_nopath  = 'Keine Pfaddefinition vorhanden'
  465.         global.txt_err_save    = 'Pfad kann nicht gespeichert werden'
  466.         global.txt_err_notbsh  = 'Zu wenig Platz fⁿr temp÷rΣren Pinsel'
  467.         global.txt_err_nofonts = 'Vektorschriften nicht auffindbar'
  468.         global.txt_err_rend    = 'Fehler bei der Zeichenerzeugung'
  469. END
  470. ELSE IF RESULT = 2 THEN DO        /* Italiano */
  471.     global.txt_title_menu  = 'Percorso AnimCharacter'
  472.     global.txt_title_new   = 'Nuovo percorso AnimCharacter'
  473.     global.txt_title_load  = 'Leggere percorso AnimCharacter'
  474.     global.txt_title_save  = 'Scrivere percorso AnimCharacter'
  475.     global.txt_title_fhand = 'Definire a mano libera'
  476.     global.txt_title_line  = 'Definire lineare'
  477.     global.txt_title_edit  = 'Modificare percorso AnimCharacter'
  478.     global.txt_title_movrs = 'Spostare percorso AnimCharacter'
  479.     global.txt_title_char  = 'Carattere'
  480.     global.txt_title_crot  = 'Angolo carattere'
  481.     global.txt_title_cshr  = 'Inclinazione carattere'
  482.     global.txt_title_cbold = 'Spessore carattere'
  483.     global.txt_title_cresz = 'Dimensione carattere'
  484.     global.txt_title_pview = 'Anteprima animazione'
  485.     global.txt_title_draw  = 'Creare animazione'
  486.     global.txt_title_data  = 'Dati percorso animazione'
  487.  
  488.     global.txt_menu_new    = 'Nuovo'
  489.     global.txt_menu_load   = 'Leggere...'
  490.     global.txt_menu_save   = 'Scrivere...'
  491.     global.txt_menu_fhand  = 'Definire a mano libera'
  492.     global.txt_menu_line   = 'Definire lineare'
  493.     global.txt_menu_edit   = 'Modificare'
  494.     global.txt_menu_movrs  = 'Spostare e ridimensionare'
  495.     global.txt_menu_char   = 'Carattere...'
  496.     global.txt_menu_crot   = 'Angolo carattere...'
  497.     global.txt_menu_cshr   = 'Inclinazione carattere...'
  498.     global.txt_menu_cbold  = 'Spessore carattere...'
  499.     global.txt_menu_cresz  = 'Dimensione carattere...'
  500.     global.txt_menu_data   = 'Dati...'
  501.     global.txt_menu_prview = 'Anteprima'
  502.  
  503.     global.txt_gad_count   = 'Pa_ssi:'
  504.     global.txt_gad_add     = 'Aggiunta _fotogrammi:'
  505.     global.txt_gad_noyes.0 = 'No'
  506.     global.txt_gad_noyes.1 = 'S∞'
  507.     global.txt_gad_direct  = 'Direzi_one:'
  508.     global.txt_gad_dirct.0 = 'Avanti'
  509.     global.txt_gad_dirct.1 = 'Indietro'
  510.     global.txt_gad_dirct.2 = 'Fermo'
  511.     global.txt_gad_draw    = '_Animare'
  512.     global.txt_gad_quit    = '_Uscire'
  513.     global.txt_gad_font    = '_Font:'
  514.     global.txt_gad_char    = '_Carattere:'
  515.     global.txt_gad_size    = '_Dimensione:'
  516.     global.txt_gad_handle  = '_Impugnatura:'
  517.     global.txt_gad_aalias  = 'An_tialias:'
  518.     global.txt_gad_aals.0  = 'Nessuno'
  519.     global.txt_gad_aals.1  = 'Basso'
  520.     global.txt_gad_aals.2  = 'Medio'
  521.     global.txt_gad_aals.3  = 'Alto'
  522.     global.txt_gad_handl.0 = 'Base sinistra'
  523.     global.txt_gad_handl.1 = 'Base centro'
  524.     global.txt_gad_handl.2 = 'Centro'
  525.     global.txt_gad_rotats  = 'Cicli _rotazione:'
  526.     global.txt_gad_fromang = '_Da angolo:'
  527.     global.txt_gad_toang   = 'Ad a_ngolo:'
  528.     global.txt_gad_rotdir  = '_Senso:'
  529.     global.txt_gad_rotdr.0 = 'Orario'
  530.     global.txt_gad_rotdr.1 = 'Antiorario'
  531.     global.txt_gad_shears  = 'Cicli _inclinazione:'
  532.     global.txt_gad_fromsh  = '_Da angolo:'
  533.     global.txt_gad_tosh    = 'Ad a_ngolo:'
  534.     global.txt_gad_resizes = 'Cicli _ridimensionamento:'
  535.     global.txt_gad_fromrs  = '_Da (%):'
  536.     global.txt_gad_tors    = 'A (_%):'
  537.     global.txt_gad_bolds   = 'Cicli _spessore:'
  538.     global.txt_gad_frombdx = '_Da orizzontale:'
  539.     global.txt_gad_tobdx   = 'A ori_zzontale:'
  540.     global.txt_gad_frombdy = 'Da _verticale:'
  541.     global.txt_gad_tobdy   = 'A ver_ticale:'
  542.     global.txt_msg_points  = 'Punti:'
  543.     global.txt_msg_ptype.0 = '(percorso a mano libera)'
  544.     global.txt_msg_ptype.1 = '(percorso lineare)'
  545.  
  546.     global.txt_err_oldcl   = 'Questa procedura richiede_una versione pi∙ recente_di Personal Paint'
  547.     global.txt_err_lost    = 'Il percorso sarα cancellato'
  548.     global.txt_err_load    = 'Il file non pu≥ essere aperto'
  549.     global.txt_err_nopath  = 'Non Φ stato definito alcun percorso'
  550.     global.txt_err_save    = 'Il percorso non pu≥ essere scritto'
  551.     global.txt_err_notbsh  = 'Non vi Φ spazio per il pennello temporaneo'
  552.     global.txt_err_nofonts = 'Non vi sono font vettoriali'
  553.     global.txt_err_rend    = 'Errore nella creazione del carattere'
  554. END
  555. ELSE DO                /* English */
  556.     global.txt_title_menu  = 'AnimCharacter Path'
  557.     global.txt_title_new   = 'New AnimCharacter Path'
  558.     global.txt_title_load  = 'Load AnimCharacter Path'
  559.     global.txt_title_save  = 'Save AnimCharacter Path'
  560.     global.txt_title_fhand = 'Define Freehand Path'
  561.     global.txt_title_line  = 'Define Linear Path'
  562.     global.txt_title_edit  = 'Edit AnimCharacter Path'
  563.     global.txt_title_movrs = 'Move/Resize AnimCharacter Path'
  564.     global.txt_title_char  = 'Character'
  565.     global.txt_title_crot  = 'Character Angle'
  566.     global.txt_title_cshr  = 'Character Shear'
  567.     global.txt_title_cbold = 'Character Boldness'
  568.     global.txt_title_cresz = 'Character Size'
  569.     global.txt_title_pview = 'Preview Path'
  570.     global.txt_title_draw  = 'Draw Animation'
  571.     global.txt_title_data  = 'AnimCharacter Path Data'
  572.  
  573.     global.txt_menu_new    = 'New'
  574.     global.txt_menu_load   = 'Load...'
  575.     global.txt_menu_save   = 'Save...'
  576.     global.txt_menu_fhand  = 'Define Freehand'
  577.     global.txt_menu_line   = 'Define Linear'
  578.     global.txt_menu_edit   = 'Edit'
  579.     global.txt_menu_movrs  = 'Move and Resize'
  580.     global.txt_menu_char   = 'Character...'
  581.     global.txt_menu_crot   = 'Character Angle...'
  582.     global.txt_menu_cshr   = 'Character Shear...'
  583.     global.txt_menu_cbold  = 'Character Boldness...'
  584.     global.txt_menu_cresz  = 'Character Size...'
  585.     global.txt_menu_data   = 'Data...'
  586.     global.txt_menu_prview = 'Preview'
  587.  
  588.     global.txt_gad_count   = 'C_ount:'
  589.     global.txt_gad_add     = 'Add _Frames:'
  590.     global.txt_gad_noyes.0 = 'No'
  591.     global.txt_gad_noyes.1 = 'Yes'
  592.     global.txt_gad_direct  = 'Directi_on:'
  593.     global.txt_gad_dirct.0 = 'Forward'
  594.     global.txt_gad_dirct.1 = 'Backward'
  595.     global.txt_gad_dirct.2 = 'Still'
  596.     global.txt_gad_draw    = '_Draw'
  597.     global.txt_gad_quit    = '_Quit'
  598.     global.txt_gad_font    = '_Font:'
  599.     global.txt_gad_char    = 'Ch_aracter:'
  600.     global.txt_gad_size    = '_Size:'
  601.     global.txt_gad_handle  = '_Handle:'
  602.     global.txt_gad_aalias  = 'An_tialias:'
  603.     global.txt_gad_aals.0  = 'None'
  604.     global.txt_gad_aals.1  = 'Low'
  605.     global.txt_gad_aals.2  = 'Medium'
  606.     global.txt_gad_aals.3  = 'High'
  607.     global.txt_gad_handl.0 = 'Base Left'
  608.     global.txt_gad_handl.1 = 'Base Center'
  609.     global.txt_gad_handl.2 = 'Center'
  610.     global.txt_gad_rotats  = '_Rotation Cycles:'
  611.     global.txt_gad_fromang = '_From Angle:'
  612.     global.txt_gad_toang   = '_To Angle:'
  613.     global.txt_gad_rotdir  = '_Direction:'
  614.     global.txt_gad_rotdr.0 = 'Clockwise'
  615.     global.txt_gad_rotdr.1 = 'Counterclockwise'
  616.     global.txt_gad_shears  = '_Shear Cycles:'
  617.     global.txt_gad_fromsh  = '_From Angle:'
  618.     global.txt_gad_tosh    = '_To Angle:'
  619.     global.txt_gad_resizes = 'Re_size Cycles:'
  620.     global.txt_gad_fromrs  = '_From (%):'
  621.     global.txt_gad_tors    = '_To (%):'
  622.     global.txt_gad_bolds   = '_Boldness Cycles:'
  623.     global.txt_gad_frombdx = '_From Horizontal:'
  624.     global.txt_gad_tobdx   = '_To Horizontal:'
  625.     global.txt_gad_frombdy = 'F_rom Vertical:'
  626.     global.txt_gad_tobdy   = 'T_o Vertical:'
  627.     global.txt_msg_points  = 'Points:'
  628.     global.txt_msg_ptype.0 = '(freehand path)'
  629.     global.txt_msg_ptype.1 = '(linear path)'
  630.  
  631.     global.txt_err_oldcl   = 'This script requires a newer_version of Personal Paint'
  632.     global.txt_err_lost    = 'The path will be lost'
  633.     global.txt_err_load    = 'The path file cannot be opened'
  634.     global.txt_err_nopath  = 'No path has been defined'
  635.     global.txt_err_save    = 'The path cannot be saved'
  636.     global.txt_err_notbsh  = 'No space for temporary brush'
  637.     global.txt_err_nofonts = 'Vector fonts not found'
  638.     global.txt_err_rend    = 'Character rendering error'
  639. END
  640.  
  641. Version 'REXX'
  642. IF RESULT < 7 THEN DO
  643.     RequestNotify 'PROMPT "'global.txt_err_oldcl'"'
  644.     EXIT 10
  645. END
  646.  
  647. tmpname = 'T:PP_AnimCharPath'
  648.  
  649. global.fontnum = 0
  650. global.pathdisp = 1
  651.  
  652. CALL DefData
  653.  
  654. LockGUI
  655.  
  656. GetPaintMode
  657. global.savepmode = RESULT
  658.  
  659. GetBrushAttributes 'WIDTH'
  660. global.bshw = RESULT
  661. GetBrushAttributes 'HEIGHT'
  662. global.bshh = RESULT
  663. GetBrushAttributes 'HANDLEX'
  664. global.bshhx = RESULT
  665. GetBrushAttributes 'HANDLEY'
  666. global.bshhy = RESULT
  667.  
  668. GetBrushAttributes 'FRAMES'
  669. global.savebshfr = RESULT
  670. GetBrushAttributes 'FRAMEPOSITION'
  671. global.savebshfp = RESULT
  672. GetBrushNumber
  673. global.savebshnum = RESULT
  674. GetCurrentBrush
  675. global.savebsh = RESULT
  676.  
  677. SetCurrentBrush 'UNUSED'
  678. IF RC ~= 0 THEN DO
  679.     RequestNotify 'TITLE "'global.txt_title_menu'" PROMPT "'global.txt_err_notbsh'"'
  680.     UnlockGUI
  681.     EXIT 0
  682. END
  683. GetBrushNumber
  684. global.tbshnum = RESULT
  685.  
  686. SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  687.  
  688. GetPen 'FOREGROUND'
  689. global.savepen = RESULT
  690. Get 'COLORS'
  691. global.xorpen = RESULT-1
  692. SetPen 'FOREGROUND' global.xorpen
  693.  
  694. Get 'BARS'
  695. savebars = RESULT
  696. Set '"BARS=0"'
  697.  
  698. Get 'GCLIP'
  699. saveclip = RESULT
  700. Set '"GCLIP=0"'
  701.  
  702. Get 'COORD'
  703. savecoord = RESULT
  704. Set '"COORD=0"'
  705.  
  706. DisableTools
  707. UnlockGUI
  708.  
  709. SIGNAL ON Break_C
  710.  
  711. /* load last used path and display it */
  712. CALL LoadPathFile(tmpname)
  713. CALL XorPath
  714.  
  715. Get 'SCREENH'
  716. IF RESULT < 225 THEN
  717.     mrows = 11
  718. ELSE
  719.     mrows = 14
  720.  
  721. command = 0
  722. DO FOREVER
  723.     Request '"'global.txt_title_menu'" COMPACT ',
  724.             '"LIST ACTION = , 14, 'command', 20, 'mrows', ',
  725.             ' ""'global.txt_menu_new'"", ',
  726.             ' ""'global.txt_menu_load'"", ',
  727.             ' ""'global.txt_menu_save'"", ',
  728.             ' ""'global.txt_menu_fhand'"", ',
  729.             ' ""'global.txt_menu_line'"", ',
  730.             ' ""'global.txt_menu_edit'"", ',
  731.             ' ""'global.txt_menu_movrs'"", ',
  732.             ' ""'global.txt_menu_char'"", ',
  733.             ' ""'global.txt_menu_crot'"", ',
  734.             ' ""'global.txt_menu_cshr'"", ',
  735.             ' ""'global.txt_menu_cbold'"", ',
  736.             ' ""'global.txt_menu_cresz'"", ',
  737.             ' ""'global.txt_menu_data'"", ',
  738.             ' ""'global.txt_menu_prview'"" ',
  739.             ' VSPACE = 4 ',
  740.             ' INTSTR = ""'global.txt_gad_count'"", 1, 32000, 'global.count' ',
  741.             ' VSPACE = 2 ',
  742.             ' CYCLE = ""'global.txt_gad_direct'"", 3, 'global.direct', ""'global.txt_gad_dirct.0'"", ""'global.txt_gad_dirct.1'"", ""'global.txt_gad_dirct.2'"" ' ||,
  743.             ' VSPACE = 2 ',
  744.             ' CHECK = ""'global.txt_gad_add'"", 'global.add' ' ||,
  745.             ' VSPACE = 2 ',
  746.             ' ACTION = ""'global.txt_gad_draw'"" ',
  747.             ' ACTION = ""'global.txt_gad_quit'"" "'
  748.     IF RC = 0 THEN DO
  749.         command = RESULT.1
  750.         global.count = RESULT.2
  751.         global.direct = RESULT.3
  752.         global.add = RESULT.4
  753.  
  754.         IF RESULT = 1 THEN DO    /* Draw */
  755.             IF DrawIt() THEN
  756.                 LEAVE
  757.         END
  758.         ELSE IF RESULT = 2 THEN    /* Quit */
  759.             LEAVE
  760.         ELSE DO     /* Command List */
  761.             IF      command = 0 THEN CALL NewPath
  762.             ELSE IF command = 1 THEN CALL LoadPath
  763.             ELSE IF command = 2 THEN CALL SavePath
  764.             ELSE IF command = 3 THEN CALL DefFreehand
  765.             ELSE IF command = 4 THEN CALL DefLinear
  766.             ELSE IF command = 5 THEN CALL EditPath
  767.             ELSE IF command = 6 THEN CALL MoveResizePath
  768.             ELSE IF command = 7 THEN CALL CharSettings
  769.             ELSE IF command = 8 THEN CALL RotSettings
  770.             ELSE IF command = 9 THEN CALL ShearSettings
  771.             ELSE IF command = 10 THEN CALL BoldSettings
  772.             ELSE IF command = 11 THEN CALL ResizeSettings
  773.             ELSE IF command = 12 THEN CALL DisplayData
  774.             ELSE IF command = 13 THEN CALL PreviewPath
  775.         END
  776.     END
  777. END
  778.  
  779. CALL SavePathFile(tmpname)
  780. CALL Break_C
  781.  
  782. EXIT 0
  783.  
  784.  
  785.  
  786.  
  787.  
  788. DefData: PROCEDURE EXPOSE global.
  789.  
  790.     global.count  = 10
  791.     global.direct = 0
  792.     global.add    = 1
  793.  
  794.     global.fontpath = 'FONTS:'
  795.     global.font     = 'CGTimes'
  796.     global.char     = 'A'
  797.     global.size     = '45'
  798.     global.handle   = 1
  799.     global.aalias   = 0
  800.  
  801.     global.rotats  = 1
  802.     global.fromang = 0 * 10000
  803.     global.toang   = 0 * 10000
  804.     global.rotdir  = 0
  805.  
  806.     global.shears  = 1
  807.     global.fromsh  = 0 * 10000
  808.     global.tosh    = 0 * 10000
  809.  
  810.     global.resizes = 1
  811.     global.fromrs  = 100 * 10000
  812.     global.tors    = 100 * 10000
  813.  
  814.     global.bolds   = 1
  815.     global.frombdx = 0 * 10000
  816.     global.tobdx   = 0 * 10000
  817.     global.frombdy = 0 * 10000
  818.     global.tobdy   = 0 * 10000
  819.  
  820.     global.points = 0
  821.     DROP global.xcoord. global.ycoord.
  822.  
  823.     RETURN
  824.  
  825.  
  826.  
  827.  
  828. NewPath: PROCEDURE EXPOSE global.
  829.  
  830.     RequestResponse 'TITLE "'global.txt_title_new'" PROMPT "'global.txt_err_lost'"'
  831.     IF RC = 0 THEN DO
  832.         IF global.points > 0 THEN
  833.             CALL XorPath
  834.  
  835.         CALL DefData
  836.     END
  837.  
  838.     RETURN
  839.  
  840.  
  841.  
  842.  
  843. LoadPathFile: PROCEDURE EXPOSE global.
  844.  
  845.     ok = 0
  846.     IF OPEN('pfile', ARG(1), 'R') THEN DO
  847.         LockGUI
  848.         IF READLN('pfile') = 'PPAINT CPATH' THEN DO
  849.             IF READLN('pfile') = '1' THEN DO
  850.                 global.count  = READLN('pfile')
  851.                 global.direct = READLN('pfile')
  852.                 global.add    = READLN('pfile')
  853.  
  854.                 global.fontpath = READLN('pfile')
  855.                 global.font     = READLN('pfile')
  856.                 global.char     = READLN('pfile')
  857.                 global.size     = READLN('pfile')
  858.                 global.handle   = READLN('pfile')
  859.                 global.aalias   = READLN('pfile')
  860.  
  861.                 global.rotats  = READLN('pfile')
  862.                 global.fromang = READLN('pfile')
  863.                 global.toang   = READLN('pfile')
  864.                 global.rotdir  = READLN('pfile')
  865.  
  866.                 global.shears  = READLN('pfile')
  867.                 global.fromsh  = READLN('pfile')
  868.                 global.tosh    = READLN('pfile')
  869.  
  870.                 global.resizes = READLN('pfile')
  871.                 global.fromrs  = READLN('pfile')
  872.                 global.tors    = READLN('pfile')
  873.  
  874.                 global.bolds   = READLN('pfile')
  875.                 global.frombdx = READLN('pfile')
  876.                 global.tobdx   = READLN('pfile')
  877.                 global.frombdy = READLN('pfile')
  878.                 global.tobdy   = READLN('pfile')
  879.  
  880.                 global.points = READLN('pfile')
  881.  
  882.                 DO point = 0 FOR global.points
  883.                     xy = READLN('pfile')
  884.                     PARSE VAR xy global.xcoord.point global.ycoord.point .
  885.                 END
  886.                 ok = 1
  887.             END
  888.         END
  889.         CALL CLOSE('pfile')
  890.         UnlockGUI
  891.     END
  892.  
  893.     RETURN ok
  894.  
  895.  
  896.  
  897.  
  898. LoadPath: PROCEDURE EXPOSE global.
  899.  
  900.     RequestFile 'TITLE "'global.txt_title_load'"'
  901.     IF RC = 0 THEN DO
  902.         PARSE VALUE RESULT WITH '"' pfilename '"'
  903.  
  904.         IF global.points > 0 THEN DO
  905.             CALL XorPath
  906.             CALL DefData
  907.         END
  908.  
  909.         IF LoadPathFile(pfilename) THEN
  910.             CALL XorPath
  911.         ELSE DO
  912.             CALL DefData
  913.             RequestNotify 'TITLE "'global.txt_title_load'" PROMPT "'global.txt_err_load'"'
  914.         END
  915.     END
  916.  
  917.     RETURN
  918.  
  919.  
  920.  
  921.  
  922. SavePathFile: PROCEDURE EXPOSE global.
  923.  
  924.     ok = 0
  925.     IF OPEN('pfile', ARG(1), 'W') THEN DO
  926.         LockGUI
  927.         CALL WRITELN('pfile', 'PPAINT CPATH')
  928.         CALL WRITELN('pfile', '1')        /* version */
  929.  
  930.         CALL WRITELN('pfile', global.count)
  931.         CALL WRITELN('pfile', global.direct)
  932.         CALL WRITELN('pfile', global.add)
  933.  
  934.         CALL WRITELN('pfile', global.fontpath)
  935.         CALL WRITELN('pfile', global.font)
  936.       CALL WRITELN('pfile', global.char)
  937.         CALL WRITELN('pfile', global.size)
  938.         CALL WRITELN('pfile', global.handle)
  939.         CALL WRITELN('pfile', global.aalias)
  940.  
  941.         CALL WRITELN('pfile', global.rotats)
  942.         CALL WRITELN('pfile', global.fromang)
  943.         CALL WRITELN('pfile', global.toang)
  944.         CALL WRITELN('pfile', global.rotdir)
  945.  
  946.         CALL WRITELN('pfile', global.shears)
  947.         CALL WRITELN('pfile', global.fromsh)
  948.         CALL WRITELN('pfile', global.tosh)
  949.  
  950.         CALL WRITELN('pfile', global.resizes)
  951.         CALL WRITELN('pfile', global.fromrs)
  952.         CALL WRITELN('pfile', global.tors)
  953.  
  954.         CALL WRITELN('pfile', global.bolds)
  955.         CALL WRITELN('pfile', global.frombdx)
  956.         CALL WRITELN('pfile', global.tobdx)
  957.         CALL WRITELN('pfile', global.frombdy)
  958.         CALL WRITELN('pfile', global.tobdy)
  959.  
  960.         CALL WRITELN('pfile', global.points)
  961.  
  962.         DO point = 0 FOR global.points
  963.             CALL WRITELN('pfile', global.xcoord.point' 'global.ycoord.point)
  964.         END
  965.         ok = 1
  966.         CALL CLOSE('pfile')
  967.         UnlockGUI
  968.     END
  969.  
  970.     RETURN ok
  971.  
  972.  
  973.  
  974.  
  975. SavePath: PROCEDURE EXPOSE global.
  976.  
  977.     IF global.points = 0 THEN DO
  978.         RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_nopath'"'
  979.         RETURN
  980.     END
  981.  
  982.     RequestFile 'TITLE "'global.txt_title_save'" SAVEMODE'
  983.     IF RC = 0 THEN DO
  984.         PARSE VALUE RESULT WITH '"' pfilename '"'
  985.         IF ~SavePathFile(pfilename) THEN
  986.             RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_save'"'
  987.     END
  988.  
  989.     RETURN
  990.  
  991.  
  992.  
  993.  
  994. XorVertex: PROCEDURE EXPOSE global.
  995.  
  996.     point = ARG(1)
  997.  
  998.     IF point > 0 THEN DO
  999.         IF point = 1 THEN
  1000.             nfp = ''
  1001.         ELSE
  1002.             nfp = 'NOFIRSTPIXEL'
  1003.         ppt = point - 1
  1004.         DrawLine global.xcoord.ppt global.ycoord.ppt global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  1005.     END
  1006.     npt = point + 1
  1007.     IF npt < global.points THEN DO
  1008.         IF point = 0 THEN
  1009.             nfp = ''
  1010.         ELSE
  1011.             nfp = 'NOFIRSTPIXEL'
  1012.         DrawLine global.xcoord.point global.ycoord.point global.xcoord.npt global.ycoord.npt 'COMPLEMENT' nfp
  1013.     END
  1014.  
  1015.     RETURN
  1016.  
  1017.  
  1018.  
  1019.  
  1020. EditPath: PROCEDURE EXPOSE global.
  1021.  
  1022.     IF global.points = 0 THEN DO
  1023.         RequestNotify 'TITLE "'global.txt_title_edit'" PROMPT "'global.txt_err_nopath'"'
  1024.         RETURN
  1025.     END
  1026.  
  1027.     SetPointer 'DATA ',
  1028.         '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  1029.         ' 0x0080,0x0000,0x0018,0x003C,0x0018,',
  1030.         ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  1031.         ' 0x0100,0x0000,0x0028,0x0044,0x0028" ',
  1032.         'HEIGHT 13 OFFSETX -1 OFFSETY 0'
  1033.  
  1034.     DO FOREVER
  1035.         WaitForClick 'DOWN POINT SHOWBRUSH'
  1036.         IF RC = 0 THEN DO
  1037.             PARSE VAR RESULT button xp yp .
  1038.  
  1039.             IF button > 1 THEN
  1040.                 LEAVE
  1041.             mindist = 30000
  1042.             DO point = 0 FOR global.points
  1043.                 GetDistance xp yp global.xcoord.point global.ycoord.point 'IMAGERATIO'
  1044.                 IF RESULT < mindist THEN DO
  1045.                     mindist = RESULT
  1046.                     mindpt = point
  1047.                 END
  1048.             END
  1049.             point = mindpt
  1050.             prev_xp = xp
  1051.             prev_yp = yp
  1052.             drawn = 0
  1053.  
  1054.             DO FOREVER
  1055.                 GetMousePosition
  1056.                 PARSE VAR RESULT xp yp .
  1057.  
  1058.                 IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  1059.                     CALL XorVertex(point)
  1060.                     global.xcoord.point = xp
  1061.                     global.ycoord.point = yp
  1062.                     CALL XorVertex(point)
  1063.  
  1064.                     prev_xp = xp
  1065.                     prev_yp = yp
  1066.                     drawn = 1
  1067.                 END
  1068.                 ELSE WaitForEvent
  1069.  
  1070.                 GetMouseButton
  1071.                 IF RESULT = 0 THEN
  1072.                     LEAVE
  1073.             END
  1074.         END
  1075.         ELSE LEAVE
  1076.     END
  1077.     SetPointer
  1078.     RETURN
  1079.  
  1080.  
  1081.  
  1082.  
  1083. MoveResizePath: PROCEDURE EXPOSE global.
  1084.  
  1085.     IF global.points = 0 THEN DO
  1086.         RequestNotify 'TITLE "'global.txt_title_movrs'" PROMPT "'global.txt_err_nopath'"'
  1087.         RETURN
  1088.     END
  1089.  
  1090.     SetPointer 'DATA ',
  1091.         '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  1092.         ' 0x04C0,0x0460,0x0020,',
  1093.         ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  1094.         ' 0x0940,0x08A0,0x0040" ',
  1095.         'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  1096.     minx = 32000
  1097.     miny = 32000
  1098.     maxx = -32000
  1099.     maxy = -32000
  1100.     DO point = 0 FOR global.points
  1101.         IF global.xcoord.point < minx THEN minx = global.xcoord.point
  1102.         IF global.xcoord.point > maxx THEN maxx = global.xcoord.point
  1103.         IF global.ycoord.point < miny THEN miny = global.ycoord.point
  1104.         IF global.ycoord.point > maxy THEN maxy = global.ycoord.point
  1105.  
  1106.         origxc.point = global.xcoord.point
  1107.         origyc.point = global.ycoord.point
  1108.     END
  1109.     w1 = maxx - minx
  1110.     h1 = maxy - miny
  1111.     minx00 = minx
  1112.     miny00 = miny
  1113.     w100 = w1
  1114.     h100 = h1
  1115.  
  1116.     DO FOREVER
  1117.         WaitForClick 'DOWN POINT'
  1118.         IF RC = 0 THEN DO
  1119.             PARSE VAR RESULT button xp yp .
  1120.  
  1121.             IF button > 1 THEN
  1122.                 LEAVE
  1123.             resize = (xp > minx+w1/2 & yp > miny+h1/2)
  1124.             IF resize THEN DO
  1125.                 SetPointer 'DATA ',
  1126.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  1127.                     ' 0x00E0,0x00A0,0x00FE,0x0022,0x0022,0x0022,0x003E,',
  1128.                     ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  1129.                     ' 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000" ',
  1130.                     'HEIGHT 15 OFFSETX -1 OFFSETY 0'
  1131.                 w10 = w1
  1132.                 h10 = h1
  1133.             END
  1134.             ELSE DO
  1135.                 minx0 = minx
  1136.                 miny0 = miny
  1137.             END
  1138.             CALL XorPath
  1139.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1140.             prev_xp = xp
  1141.             prev_yp = yp
  1142.  
  1143.             DO FOREVER
  1144.                 GetMousePosition
  1145.                 PARSE VAR RESULT xp yp .
  1146.  
  1147.                 IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1148.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1149.                     IF resize THEN DO
  1150.                         w1 = w1 + (xp - prev_xp)
  1151.                         h1 = h1 + (yp - prev_yp)
  1152.                         IF w1 < 1 THEN w1 = 1
  1153.                         IF h1 < 1 THEN h1 = 1
  1154.                         maxx = minx + w1
  1155.                         maxy = miny + h1
  1156.                     END
  1157.                     ELSE DO
  1158.                         minx = minx + (xp - prev_xp)
  1159.                         miny = miny + (yp - prev_yp)
  1160.                         maxx = minx + w1
  1161.                         maxy = miny + h1
  1162.                     END
  1163.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1164.                     prev_xp = xp
  1165.                     prev_yp = yp
  1166.                 END
  1167.                 ELSE WaitForEvent
  1168.  
  1169.                 GetMouseButton
  1170.                 IF RESULT = 0 THEN
  1171.                     LEAVE
  1172.             END
  1173.  
  1174.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1175.             IF resize THEN DO
  1176.                 IF w10 ~= w1 | h10 ~= h1 THEN DO
  1177.                     mx = w1 / w100
  1178.                     my = h1 / h100
  1179.                     DO point = 0 FOR global.points
  1180.                         global.xcoord.point = minx + TRUNC((origxc.point - minx00) * mx)
  1181.                         global.ycoord.point = miny + TRUNC((origyc.point - miny00) * my)
  1182.                     END
  1183.                 END
  1184.                 SetPointer 'DATA ',
  1185.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  1186.                     ' 0x04C0,0x0460,0x0020,',
  1187.                     ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  1188.                     ' 0x0940,0x08A0,0x0040" ',
  1189.                     'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  1190.             END
  1191.             ELSE DO
  1192.                 IF minx ~= minx0 | miny ~= miny0 THEN DO
  1193.                     dx = minx - minx0
  1194.                     dy = miny - miny0
  1195.                     DO point = 0 FOR global.points
  1196.                         global.xcoord.point = global.xcoord.point + dx
  1197.                         global.ycoord.point = global.ycoord.point + dy
  1198.                     END
  1199.                 END
  1200.             END
  1201.             CALL XorPath
  1202.         END
  1203.         ELSE LEAVE
  1204.     END
  1205.     SetPointer
  1206.  
  1207.     RETURN
  1208.  
  1209.  
  1210.  
  1211.  
  1212. SetFirstChar: PROCEDURE EXPOSE global.
  1213.  
  1214.     SetCurrentBrush 'BRUSH' global.tbshnum
  1215.     IF RC ~= 0 THEN
  1216.         RETURN
  1217.  
  1218.     global.rot_ang = global.fromang
  1219.     global.shear = global.fromsh
  1220.     global.bold_x = global.frombdx
  1221.     global.bold_y = global.frombdy
  1222.     global.resize = global.fromrs
  1223.     IF CreateCharacter(0) THEN DO
  1224.         SetPaintMode 'COLOR'
  1225.         SetPen 'FOREGROUND' global.savepen
  1226.         RETURN 1
  1227.     END
  1228.  
  1229.     RETURN 0
  1230.  
  1231.  
  1232.  
  1233.  
  1234. DefFreehand: PROCEDURE EXPOSE global.
  1235.  
  1236.     LockGUI
  1237.     IF global.points > 0 THEN DO
  1238.         CALL XorPath
  1239.         DROP global.xcoord. global.ycoord.
  1240.         global.points = 0
  1241.     END
  1242.  
  1243.     IF ~SetFirstChar() THEN DO
  1244.         RequestNotify 'TITLE "'global.txt_title_fhand'" PROMPT "'global.txt_err_rend'"'
  1245.         UnlockGUI
  1246.         RETURN
  1247.     END
  1248.     UnlockGUI
  1249.  
  1250.     button = 0
  1251.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1252.     IF RC = 0 THEN
  1253.         PARSE VAR RESULT button x0 y0 .
  1254.  
  1255.     FreeBrush 'FORCE QUIET'
  1256.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1257.     SetPen 'FOREGROUND' global.xorpen
  1258.  
  1259.     IF button > 0 THEN DO
  1260.         prev_xp = x0
  1261.         prev_yp = y0
  1262.         global.xcoord.0 = x0
  1263.         global.ycoord.0 = y0
  1264.         point = 1
  1265.  
  1266.         DO FOREVER
  1267.             GetMousePosition
  1268.             PARSE VAR RESULT xp yp .
  1269.  
  1270.             IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1271.                 IF point = 1 THEN
  1272.                     nfp = ''
  1273.                 ELSE
  1274.                     nfp = 'NOFIRSTPIXEL'
  1275.                 DrawLine prev_xp prev_yp xp yp 'COMPLEMENT' nfp
  1276.  
  1277.                 global.xcoord.point = xp
  1278.                 global.ycoord.point = yp
  1279.                 point = point + 1
  1280.  
  1281.                 prev_xp = xp
  1282.                 prev_yp = yp
  1283.             END
  1284.             ELSE WaitForEvent
  1285.  
  1286.             GetMouseButton
  1287.             IF RESULT ~= button THEN
  1288.                 LEAVE
  1289.         END
  1290.         IF point = 1 THEN DO
  1291.             point = 2
  1292.             global.xcoord.1 = global.xcoord.0
  1293.             global.ycoord.1 = global.ycoord.0
  1294.         END
  1295.         global.points = point
  1296.     END
  1297.  
  1298.     RETURN
  1299.  
  1300.  
  1301.  
  1302.  
  1303. DefLinear: PROCEDURE EXPOSE global.
  1304.  
  1305.     LockGUI
  1306.     IF global.points > 0 THEN DO
  1307.         CALL XorPath
  1308.         DROP global.xcoord. global.ycoord.
  1309.         global.points = 0
  1310.     END
  1311.  
  1312.     IF ~SetFirstChar() THEN DO
  1313.         RequestNotify 'TITLE "'global.txt_title_fhand'" PROMPT "'global.txt_err_rend'"'
  1314.         UnlockGUI
  1315.         RETURN
  1316.     END
  1317.     UnlockGUI
  1318.  
  1319.     button = 0
  1320.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1321.     IF RC = 0 THEN
  1322.         PARSE VAR RESULT button x0 y0 .
  1323.  
  1324.     FreeBrush 'FORCE QUIET'
  1325.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1326.     SetPen 'FOREGROUND' global.xorpen
  1327.  
  1328.     IF button > 0 THEN DO
  1329.         prev_xp = x0
  1330.         prev_yp = y0
  1331.         global.xcoord.0 = x0
  1332.         global.ycoord.0 = y0
  1333.         drawn = 0
  1334.  
  1335.         DO FOREVER
  1336.             GetMousePosition
  1337.             PARSE VAR RESULT xp yp .
  1338.  
  1339.             IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  1340.                 IF drawn THEN
  1341.                     Undo
  1342.                 DrawLine x0 y0 xp yp 'COMPLEMENT'
  1343.  
  1344.                 global.xcoord.1 = xp
  1345.                 global.ycoord.1 = yp
  1346.                 prev_xp = xp
  1347.                 prev_yp = yp
  1348.                 drawn = 1
  1349.             END
  1350.             ELSE WaitForEvent
  1351.  
  1352.             GetMouseButton
  1353.             IF RESULT ~= button THEN
  1354.                 LEAVE
  1355.         END
  1356.         global.points = 2
  1357.     END
  1358.  
  1359.     RETURN
  1360.  
  1361.  
  1362.  
  1363.  
  1364. InitStep: PROCEDURE EXPOSE global.
  1365.  
  1366.     IF global.points = 2 THEN DO
  1367.         IF global.count > 1 THEN DO
  1368.             global.line_xs = (global.xcoord.1 - global.xcoord.0) / (global.count - 1)
  1369.             global.line_ys = (global.ycoord.1 - global.ycoord.0) / (global.count - 1)
  1370.         END
  1371.         ELSE DO
  1372.             global.line_xs = 0
  1373.             global.line_ys = 0
  1374.         END
  1375.         global.line_xp = global.xcoord.0
  1376.         global.line_yp = global.ycoord.0
  1377.     END
  1378.     ELSE DO
  1379.         global.point_s = global.points / global.count
  1380.         global.point_p = 0
  1381.     END
  1382.  
  1383.     IF global.fromang ~= global.toang | global.rotats > 1 THEN DO
  1384.         global.do_rot = 1
  1385.         IF global.fromang > global.toang & global.rotdir = 0 THEN
  1386.             rotdeg = (3600000 - global.fromang) + global.toang
  1387.         ELSE IF global.fromang < global.toang & global.rotdir = 1 THEN
  1388.             rotdeg = global.fromang + (3600000 - global.toang)
  1389.         ELSE
  1390.             rotdeg = ABS(global.toang - global.fromang)
  1391.  
  1392.         rotdeg = rotdeg + ((global.rotats - 1) * 3600000)
  1393.         IF global.count > 1 THEN
  1394.             global.rot_step =    rotdeg / (global.count - 1)
  1395.         ELSE
  1396.             global.rot_step =    0
  1397.         IF global.rotdir > 0 THEN
  1398.             global.rot_step = -global.rot_step
  1399.     END
  1400.     ELSE
  1401.         global.do_rot = 0
  1402.     global.rot_ang = global.fromang
  1403.  
  1404.     IF global.fromsh ~= global.tosh | global.shears > 1 THEN DO
  1405.         global.do_shear = 1
  1406.         shr_deg = ABS(global.tosh - global.fromsh)
  1407.         IF global.count > 1 THEN
  1408.             global.shear_s = (shr_deg * global.shears) / (global.count - 1)
  1409.         ELSE
  1410.             global.shear_s =    0
  1411.         IF global.tosh < global.fromsh THEN
  1412.             global.shear_s = -global.shear_s
  1413.         global.min_sh = MIN(global.fromsh, global.tosh)
  1414.         global.max_sh = MAX(global.fromsh, global.tosh)
  1415.     END
  1416.     ELSE
  1417.         global.do_shear = 0
  1418.     global.shear = global.fromsh
  1419.  
  1420.     IF global.frombdx ~= global.tobdx | global.frombdy ~= global.tobdy | global.bolds > 1 THEN DO
  1421.         global.do_bold = 1
  1422.         boldx = ABS(global.tobdx - global.frombdx)
  1423.         IF global.count > 1 THEN
  1424.             global.bold_sx =    (boldx * global.bolds) / (global.count - 1)
  1425.         ELSE
  1426.             global.bold_sx =    0
  1427.         IF global.tobdx < global.frombdx THEN
  1428.             global.bold_sx = -global.bold_sx
  1429.         global.min_bdx = MIN(global.frombdx, global.tobdx)
  1430.         global.max_bdx = MAX(global.frombdx, global.tobdx)
  1431.  
  1432.         boldy = ABS(global.tobdy - global.frombdy)
  1433.         IF global.count > 1 THEN
  1434.             global.bold_sy =    (boldy * global.bolds) / (global.count - 1)
  1435.         ELSE
  1436.             global.bold_sy =    0
  1437.         IF global.tobdy < global.frombdy THEN
  1438.             global.bold_sy = -global.bold_sy
  1439.         global.min_bdy = MIN(global.frombdy, global.tobdy)
  1440.         global.max_bdy = MAX(global.frombdy, global.tobdy)
  1441.     END
  1442.     ELSE
  1443.         global.do_bold = 0
  1444.     global.bold_x = global.frombdx
  1445.     global.bold_y = global.frombdy
  1446.  
  1447.     IF global.fromrs ~= global.tors | global.resizes > 1 THEN DO
  1448.         global.do_resize = 1
  1449.         resz = ABS(global.tors - global.fromrs)
  1450.         IF global.count > 1 THEN
  1451.             global.resize_s = (resz * global.resizes) / (global.count - 1)
  1452.         ELSE
  1453.             global.resize_s =    0
  1454.         IF global.tors < global.fromrs THEN
  1455.             global.resize_s = -global.resize_s
  1456.         global.min_rs = MIN(global.fromrs, global.tors)
  1457.         global.max_rs = MAX(global.fromrs, global.tors)
  1458.     END
  1459.     ELSE
  1460.         global.do_resize = 0
  1461.     global.resize = global.fromrs
  1462.  
  1463.     RETURN
  1464.  
  1465.  
  1466.  
  1467.  
  1468. GetStep: PROCEDURE EXPOSE global.
  1469.  
  1470.     IF global.points = 2 THEN DO
  1471.         xp = TRUNC(global.line_xp + 0.5)
  1472.         yp = TRUNC(global.line_yp + 0.5)
  1473.     END
  1474.     ELSE DO
  1475.         point = TRUNC(global.point_p + 0.5)
  1476.         xp = global.xcoord.point
  1477.         yp = global.ycoord.point
  1478.     END
  1479.  
  1480.     RETURN xp yp
  1481.  
  1482.  
  1483.  
  1484.  
  1485. CreateCharacter: PROCEDURE EXPOSE global.
  1486.  
  1487.     antialias = ARG(1)
  1488.     ang  = TRUNC(global.rot_ang / 10 + 0.5)
  1489.     shr  = TRUNC(global.shear / 10 + 0.5 * SIGN(global.shear))
  1490.     bldx = TRUNC(global.bold_x / 10 + 0.5 * SIGN(global.bold_x))
  1491.     bldy = TRUNC(global.bold_y / 10 + 0.5 * SIGN(global.bold_y))
  1492.  
  1493.     IF global.resize ~= 1000000 THEN DO
  1494.         siz = TRUNC(global.size * (global.resize / 1000000) + 0.5)
  1495.         IF siz < 1 THEN
  1496.             siz = 1
  1497.     END
  1498.     ELSE siz = global.size
  1499.  
  1500.     IF global.char = '"' THEN
  1501.         chr = '""'
  1502.     ELSE
  1503.         chr = global.char
  1504.  
  1505.     VectorCharacter 'CHARACTER "'chr'" FONTPATH "'global.fontpath'" FONTNAME "'global.font'" HEIGHT 'siz' ANGLE 'ang' SHEAR 'shr' BOLDX 'bldx' BOLDY 'bldy' ANTIALIAS 'antialias
  1506.     IF RC = 0 THEN DO
  1507.         PARSE VAR RESULT . . hx hy .
  1508.  
  1509.         IF global.handle = 1 THEN
  1510.             SetBrushAttributes 'HANDLEX 'hx' HANDLEY 'hy
  1511.         ELSE IF global.handle = 2 THEN DO
  1512.             GetBrushAttributes 'BOUNDARIES'
  1513.             PARSE VAR RESULT x0 y0 x1 y1 .
  1514.             SetBrushAttributes 'HANDLEX 'x0+((x1-x0+1)%2)' HANDLEY 'y0+((y1-y0+1)%2)
  1515.         END
  1516.         RETURN 1
  1517.     END
  1518.  
  1519.     RETURN 0
  1520.  
  1521.  
  1522.  
  1523.  
  1524. PreviewStep: PROCEDURE EXPOSE global.
  1525.  
  1526.     IF CreateCharacter(0) THEN DO
  1527.         SetPaintMode 'COLOR'
  1528.         Undo global.prvwundo
  1529.  
  1530.         IF ~global.add & global.prvwundo ~= 0 THEN DO
  1531.             IF global.direct = 0 THEN
  1532.                 SetFramePosition 'NEXT'
  1533.             ELSE IF global.direct = 1 THEN
  1534.                 SetFramePosition 'PREVIOUS'
  1535.         END
  1536.         PutBrush ARG(1)
  1537.         global.prvwundo = 1
  1538.         RETURN 1
  1539.     END
  1540.  
  1541.     RETURN 0
  1542.  
  1543.  
  1544.  
  1545.  
  1546. NextStep: PROCEDURE EXPOSE global.
  1547.  
  1548.     IF global.points = 2 THEN DO
  1549.         global.line_xp = global.line_xp + global.line_xs
  1550.         global.line_yp = global.line_yp + global.line_ys
  1551.     END
  1552.     ELSE
  1553.         global.point_p = global.point_p + global.point_s
  1554.  
  1555.     IF global.do_rot THEN
  1556.         global.rot_ang = global.rot_ang + global.rot_step
  1557.  
  1558.     IF global.do_shear THEN DO
  1559.         global.shear = global.shear + global.shear_s
  1560.         IF global.shear_s > 0 THEN DO
  1561.             IF global.shear > global.max_sh THEN DO
  1562.                 excd = global.shear - global.max_sh
  1563.                 global.shear = global.max_sh - excd
  1564.                 global.shear_s = -global.shear_s
  1565.             END
  1566.         END
  1567.         ELSE DO
  1568.             IF global.shear < global.min_sh THEN DO
  1569.                 excd = global.min_sh - global.shear
  1570.                 global.shear = global.min_sh + excd
  1571.                 global.shear_s = -global.shear_s
  1572.             END
  1573.         END
  1574.     END
  1575.  
  1576.     IF global.do_bold THEN DO
  1577.         global.bold_x = global.bold_x + global.bold_sx
  1578.         IF global.bold_sx > 0 THEN DO
  1579.             IF global.bold_x > global.max_bdx THEN DO
  1580.                 excd = global.bold_x - global.max_bdx
  1581.                 global.bold_x = global.max_bdx - excd
  1582.                 global.bold_sx = -global.bold_sx
  1583.             END
  1584.         END
  1585.         ELSE DO
  1586.             IF global.bold_x < global.min_bdx THEN DO
  1587.                 excd = global.min_bdx - global.bold_x
  1588.                 global.bold_x = global.min_bdx + excd
  1589.                 global.bold_sx = -global.bold_sx
  1590.             END
  1591.         END
  1592.  
  1593.         global.bold_y = global.bold_y + global.bold_sy
  1594.         IF global.bold_sy > 0 THEN DO
  1595.             IF global.bold_y > global.max_bdy THEN DO
  1596.                 excd = global.bold_y - global.max_bdy
  1597.                 global.bold_y = global.max_bdy - excd
  1598.                 global.bold_sy = -global.bold_sy
  1599.             END
  1600.         END
  1601.         ELSE DO
  1602.             IF global.bold_y < global.min_bdy THEN DO
  1603.                 excd = global.min_bdy - global.bold_y
  1604.                 global.bold_y = global.min_bdy + excd
  1605.                 global.bold_sy = -global.bold_sy
  1606.             END
  1607.         END
  1608.     END
  1609.  
  1610.     IF global.do_resize THEN DO
  1611.         global.resize = global.resize + global.resize_s
  1612.         IF global.resize_s > 0 THEN DO
  1613.             IF global.resize > global.max_rs THEN DO
  1614.                 excd = global.resize - global.max_rs
  1615.                 global.resize = global.max_rs - excd
  1616.                 global.resize_s = -global.resize_s
  1617.             END
  1618.         END
  1619.         ELSE DO
  1620.             IF global.resize < global.min_rs THEN DO
  1621.                 excd = global.min_rs - global.resize
  1622.                 global.resize = global.min_rs + excd
  1623.                 global.resize_s = -global.resize_s
  1624.             END
  1625.         END
  1626.     END
  1627.  
  1628.     RETURN
  1629.  
  1630.  
  1631.  
  1632.  
  1633. PreviewBegin: PROCEDURE EXPOSE global.
  1634.  
  1635.     SetCurrentBrush 'BRUSH' global.tbshnum
  1636.     SetPen 'FOREGROUND' global.savepen
  1637.     GetFramePosition
  1638.     IF RC = 0 THEN
  1639.         global.savefrpos = RESULT
  1640.     ELSE
  1641.         global.savefrpos = 0
  1642.     global.prvwundo = 0
  1643.  
  1644.     RETURN
  1645.  
  1646.  
  1647.  
  1648.  
  1649. PreviewEnd: PROCEDURE EXPOSE global.
  1650.  
  1651.     Undo global.prvwundo
  1652.     FreeBrush 'FORCE QUIET'
  1653.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1654.     SetPen 'FOREGROUND' global.xorpen
  1655.     IF global.savefrpos > 0 THEN
  1656.         SetFramePosition global.savefrpos
  1657.  
  1658.     RETURN
  1659.  
  1660.  
  1661.  
  1662.  
  1663. PreviewPath: PROCEDURE EXPOSE global.
  1664.  
  1665.     IF global.points = 0 THEN DO
  1666.         RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_nopath'"'
  1667.         RETURN
  1668.     END
  1669.     LockGUI
  1670.     CALL XorPath
  1671.     CALL InitStep
  1672.     CALL PreviewBegin
  1673.  
  1674.     DO cnt = 1 to global.count
  1675.         IF ~PreviewStep( GetStep() ) THEN DO
  1676.             RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_rend'"'
  1677.             LEAVE
  1678.         END
  1679.         Wait 'TIME 200'
  1680.         CALL NextStep()
  1681.     END
  1682.     Wait 'TIME 200'
  1683.  
  1684.     CALL PreviewEnd
  1685.     CALL XorPath
  1686.     UnlockGUI
  1687.  
  1688.     RETURN
  1689.  
  1690.  
  1691.  
  1692.  
  1693. DrawStep: PROCEDURE EXPOSE global.
  1694.  
  1695.     IF CreateCharacter(global.aalias) THEN DO
  1696.         pos = ARG(1)
  1697.         PARSE VAR pos px py .
  1698.         SetPaintMode 'COLOR'
  1699.  
  1700.         IF global.aalias > 0 THEN DO
  1701.             Process 'IMAGE BRUSHMODE X0 'px' Y0 'py' FILTER "Brush Alpha Channel (Single)" NOFS'
  1702.             IF RC ~= 0 THEN DO
  1703.                 IF RC ~= 5 THEN
  1704.                     RequestNotify 'PROMPT "'global.txt_err_rend'('RC')"'
  1705.                 RETURN 0
  1706.             END
  1707.         END
  1708.         ELSE PutBrush px py
  1709.  
  1710.         global.prvwundo = 1
  1711.         RETURN 1
  1712.     END
  1713.  
  1714.     RETURN 0
  1715.  
  1716.  
  1717.  
  1718.  
  1719. DrawIt: PROCEDURE EXPOSE global.
  1720.  
  1721.     IF global.points = 0 THEN DO
  1722.         RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_nopath'"'
  1723.         RETURN 0
  1724.     END
  1725.     LockGUI
  1726.     CALL XorPath
  1727.     CALL InitStep
  1728.     global.pathdisp = 0
  1729.     SetCurrentBrush 'BRUSH' global.tbshnum
  1730.     SetPen 'FOREGROUND' global.savepen
  1731.  
  1732.     IF global.add THEN DO
  1733.         GetFramePosition
  1734.         IF RC = 0 THEN
  1735.             frpos = RESULT
  1736.         ELSE
  1737.             frpos = 0
  1738.         AddFrames global.count
  1739.         IF global.direct = 1 THEN
  1740.             SetFramePosition frpos + global.count
  1741.     END
  1742.  
  1743.     DO cnt = 1 to global.count
  1744.         IF ~DrawStep( GetStep() ) THEN DO
  1745.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_rend'"'
  1746.             LEAVE
  1747.         END
  1748.         IF global.direct = 0 THEN
  1749.             SetFramePosition 'NEXT'
  1750.         ELSE IF global.direct = 1 THEN
  1751.             SetFramePosition 'PREVIOUS'
  1752.         CALL NextStep()
  1753.     END
  1754.  
  1755.     FreeBrush 'FORCE QUIET'
  1756.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1757.     SetPen 'FOREGROUND' global.xorpen
  1758.     UnlockGUI
  1759.  
  1760.     RETURN 1
  1761.  
  1762.  
  1763.  
  1764.  
  1765. CharSettings: PROCEDURE EXPOSE global.
  1766.  
  1767.     IF global.fontnum = 0 THEN DO
  1768.         LockGUI
  1769.         global.fontpath = LoadSet('PP_VectorPath', global.fontpath, 1, 0)
  1770.  
  1771.         ftot = 0
  1772.         vftfname = 'ENV:PP_VectorFonts'
  1773.         IF ~OPEN(fexists, vftfname) THEN DO
  1774.             ADDRESS COMMAND 'List >'vftfname' 'global.fontpath' PAT=#?.otag NOHEAD LFORMAT="%s"'
  1775.             ADDRESS COMMAND 'Sort 'vftfname vftfname'.s'
  1776.             IF RC = 0 THEN DO
  1777.                 ADDRESS COMMAND 'Delete >NIL: 'vftfname
  1778.                 ADDRESS COMMAND 'Copy >NIL: 'vftfname'.s' vftfname
  1779.                 ADDRESS COMMAND 'Delete >NIL: 'vftfname'.s'
  1780.             END
  1781.         END
  1782.         ELSE CALL CLOSE(fexists)
  1783.  
  1784.         IF OPEN('listfile', vftfname) THEN DO
  1785.             DO FOREVER
  1786.                 fline = READLN('listfile')
  1787.                 IF EOF('listfile') THEN BREAK
  1788.                 ftot = ftot + 1
  1789.                 global.fontname.ftot = LEFT(fline, LENGTH(fline) - 5)
  1790.             END
  1791.             CALL CLOSE('listfile')
  1792.         END
  1793.         UnlockGUI
  1794.  
  1795.         IF ftot = 0 THEN DO
  1796.             RequestNotify 'PROMPT "'global.txt_err_nofonts'"'
  1797.             RETURN
  1798.         END
  1799.         global.fontnum = ftot
  1800.     END
  1801.  
  1802.     selfont = 0
  1803.     DO f = 1 TO global.fontnum
  1804.         IF UPPER(global.fontname.f) = UPPER(global.font) THEN DO
  1805.             selfont = f - 1
  1806.             LEAVE
  1807.         END
  1808.     END
  1809.  
  1810.     req = '"LIST = ""'global.txt_gad_font'"", 'global.fontnum', 'selfont', 20, 5'
  1811.     DO f = 1 TO global.fontnum
  1812.         req = req || ', ""' || global.fontname.f || '""'
  1813.     END
  1814.     req = req ||,
  1815.          ' VSPACE = 2 ' ||,
  1816.           'STRING = ""'global.txt_gad_char'"", 2, ""'global.char'"" ' ||,
  1817.           'VSPACE = 2 ' ||,
  1818.          'INTSTR = ""'global.txt_gad_size'"", 1, 32000, 'global.size' ' ||,
  1819.           'VSPACE = 2 ' ||,
  1820.             'CYCLE = ""'global.txt_gad_handle'"", 3, 'global.handle', ""'global.txt_gad_handl.0'"", ""'global.txt_gad_handl.1'"", ""'global.txt_gad_handl.2'"" ' ||,
  1821.           'VSPACE = 2 ' ||,
  1822.             'CYCLE = ""'global.txt_gad_aalias'"", 4, 'global.aalias', ""'global.txt_gad_aals.0'"", ""'global.txt_gad_aals.1'"", ""'global.txt_gad_aals.2'"", ""'global.txt_gad_aals.3'"" ' ||,
  1823.           'VSPACE = 2 "'
  1824.  
  1825.     Request 'RESIZE COMPACT "'global.txt_title_char'" 'req
  1826.     IF RC = 0 THEN DO
  1827.         fn = RESULT.1 + 1
  1828.         global.font = global.fontname.fn
  1829.         global.char = RESULT.2
  1830.         global.size = RESULT.3
  1831.         global.handle = RESULT.4
  1832.         global.aalias = RESULT.5
  1833.     END
  1834.  
  1835.     RETURN
  1836.  
  1837.  
  1838.  
  1839.  
  1840. RotSettings: PROCEDURE EXPOSE global.
  1841.  
  1842.     Request '"'global.txt_title_crot'" ',
  1843.             '"INTSTR = ""'global.txt_gad_rotats'"", 1, 32000, 'global.rotats' ',
  1844.             ' INT10000STR = ""'global.txt_gad_fromang'"", 0, 3590000, 'global.fromang' ',
  1845.             ' INT10000STR = ""'global.txt_gad_toang'"", 0, 3590000, 'global.toang' ',
  1846.             ' CYCLE = ""'global.txt_gad_rotdir'"", 2, 'global.rotdir', ""'global.txt_gad_rotdr.0'"", ""'global.txt_gad_rotdr.1'"" "'
  1847.     IF RC = 0 THEN DO
  1848.         global.rotats = RESULT.1
  1849.         global.fromang = RESULT.2
  1850.         global.toang = RESULT.3
  1851.         global.rotdir = RESULT.4
  1852.     END
  1853.  
  1854.     RETURN
  1855.  
  1856.  
  1857.  
  1858.  
  1859. ShearSettings: PROCEDURE EXPOSE global.
  1860.  
  1861.     Request '"'global.txt_title_cshr'" ',
  1862.             '"INTSTR = ""'global.txt_gad_shears'"", 1, 32000, 'global.shears' ',
  1863.             ' INT10000STR = ""'global.txt_gad_fromsh'"", -450000, 450000, 'global.fromsh' ',
  1864.             ' INT10000STR = ""'global.txt_gad_tosh'"", -450000, 450000, 'global.tosh' "'
  1865.     IF RC = 0 THEN DO
  1866.         global.shears = RESULT.1
  1867.         global.fromsh = RESULT.2
  1868.         global.tosh   = RESULT.3
  1869.     END
  1870.  
  1871.     RETURN
  1872.  
  1873.  
  1874.  
  1875.  
  1876. ResizeSettings: PROCEDURE EXPOSE global.
  1877.  
  1878.     Request '"'global.txt_title_cresz'" ',
  1879.             '"INTSTR = ""'global.txt_gad_resizes'"", 1, 32000, 'global.resizes' ',
  1880.             ' INT10000STR = ""'global.txt_gad_fromrs'"", 00100, 320000000, 'global.fromrs' ',
  1881.             ' INT10000STR = ""'global.txt_gad_tors'"", 00100, 320000000, 'global.tors' "'
  1882.     IF RC = 0 THEN DO
  1883.         global.resizes = RESULT.1
  1884.         global.fromrs  = RESULT.2
  1885.         global.tors    = RESULT.3
  1886.     END
  1887.  
  1888.     RETURN
  1889.  
  1890.  
  1891.  
  1892.  
  1893. BoldSettings: PROCEDURE EXPOSE global.
  1894.  
  1895.     Request '"'global.txt_title_cbold'" ',
  1896.             '"INTSTR = ""'global.txt_gad_bolds'"", 1, 32000, 'global.bolds' ',
  1897.             ' INT10000STR = ""'global.txt_gad_frombdx'"", -80000, 80000, 'global.frombdx' ',
  1898.             ' INT10000STR = ""'global.txt_gad_tobdx'"", -80000, 80000, 'global.tobdx' ',
  1899.             ' INT10000STR = ""'global.txt_gad_frombdy'"", -80000, 80000, 'global.frombdy' ',
  1900.             ' INT10000STR = ""'global.txt_gad_tobdy'"", -80000, 80000, 'global.tobdy' "'
  1901.     IF RC = 0 THEN DO
  1902.         global.bolds   = RESULT.1
  1903.         global.frombdx = RESULT.2
  1904.         global.tobdx   = RESULT.3
  1905.         global.frombdy = RESULT.4
  1906.         global.tobdy   = RESULT.5
  1907.     END
  1908.  
  1909.     RETURN
  1910.  
  1911.  
  1912.  
  1913.  
  1914. DisplayData: PROCEDURE EXPOSE global.
  1915.  
  1916.     direct = global.direct
  1917.     add = global.add
  1918.     rotdir = global.rotdir
  1919.     handle = global.handle
  1920.     antialias = global.aalias
  1921.  
  1922.     str = COMPRESS(global.txt_gad_count, '_') global.count || '0A'x ||,
  1923.           COMPRESS(global.txt_gad_direct, '_') global.txt_gad_dirct.direct || '0A'x ||,
  1924.           COMPRESS(global.txt_gad_add, '_') global.txt_gad_noyes.add || '0A'x ||,
  1925.           '0A'x ||,
  1926.           COMPRESS(global.txt_gad_font, '_') global.font || '0A'x ||,
  1927.           COMPRESS(global.txt_gad_char, '_') global.char || '0A'x ||,
  1928.           COMPRESS(global.txt_gad_size, '_') global.size || '0A'x ||,
  1929.           COMPRESS(global.txt_gad_handle, '_') global.txt_gad_handl.handle || '0A'x ||,
  1930.           COMPRESS(global.txt_gad_aalias, '_') global.txt_gad_aals.antialias || '0A'x ||,
  1931.           '0A'x ||,
  1932.           COMPRESS(global.txt_gad_rotats, '_') global.rotats || '0A'x ||,
  1933.           COMPRESS(global.txt_gad_fromang, '_') (global.fromang / 10000) || '0A'x ||,
  1934.           COMPRESS(global.txt_gad_toang, '_') (global.toang / 10000) || '0A'x ||,
  1935.           COMPRESS(global.txt_gad_rotdir, '_') global.txt_gad_rotdr.rotdir || '0A'x ||,
  1936.           '0A'x ||,
  1937.           COMPRESS(global.txt_gad_shears, '_') global.shears || '0A'x ||,
  1938.           COMPRESS(global.txt_gad_fromsh, '_') (global.fromsh / 10000) || '0A'x ||,
  1939.           COMPRESS(global.txt_gad_tosh, '_') (global.tosh / 10000) || '0A'x ||,
  1940.           '0A'x ||,
  1941.           COMPRESS(global.txt_gad_resizes, '_') global.resizes || '0A'x ||,
  1942.           COMPRESS(global.txt_gad_fromrs, '_') (global.fromrs / 10000) || '0A'x ||,
  1943.           COMPRESS(global.txt_gad_tors, '_') (global.tors / 10000) || '0A'x ||,
  1944.           '0A'x ||,
  1945.           COMPRESS(global.txt_gad_bolds, '_') global.bolds || '0A'x ||,
  1946.           COMPRESS(global.txt_gad_frombdx, '_') global.frombdx || '0A'x ||,
  1947.           COMPRESS(global.txt_gad_tobdx, '_') global.tobdx || '0A'x ||,
  1948.           COMPRESS(global.txt_gad_frombdy, '_') global.frombdy || '0A'x ||,
  1949.           COMPRESS(global.txt_gad_tobdy, '_') global.tobdy || '0A'x
  1950.  
  1951.     pos = 1
  1952.     DO FOREVER
  1953.         pos = INDEX(str, '"', pos)
  1954.         IF pos = 0 THEN
  1955.             BREAK
  1956.         str = INSERT('"', str, pos)
  1957.         pos = pos + 2
  1958.     END
  1959.  
  1960.     IF global.points > 0 THEN DO
  1961.         IF global.points = 2 THEN
  1962.             ptype = 1
  1963.         ELSE
  1964.             ptype = 0
  1965.  
  1966.         str = str ||,
  1967.               '0A'x ||,
  1968.               global.txt_msg_points global.points global.txt_msg_ptype.ptype || '0A'x ||,
  1969.               '0A'x
  1970.  
  1971.         DO point = 0 FOR global.points
  1972.             str = str || global.xcoord.point','global.ycoord.point || '0A'x
  1973.         END
  1974.     END
  1975.     RequestNotify '"'global.txt_title_data'" "'str'" SCROLL'
  1976.  
  1977.     RETURN
  1978.  
  1979.  
  1980.  
  1981.  
  1982. XorPath: PROCEDURE EXPOSE global.
  1983.  
  1984.     IF global.points > 0 THEN DO
  1985.         xp = global.xcoord.0
  1986.         yp = global.ycoord.0
  1987.         last = global.points - 1
  1988.  
  1989.         DO point = 1 TO last
  1990.             IF point = 1 THEN
  1991.                 nfp = ''
  1992.             ELSE
  1993.                 nfp = 'NOFIRSTPIXEL'
  1994.             DrawLine xp yp global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  1995.  
  1996.             xp = global.xcoord.point
  1997.             yp = global.ycoord.point
  1998.         END
  1999.     END
  2000.  
  2001.     RETURN
  2002.  
  2003.  
  2004.  
  2005.  
  2006. LoadSet: PROCEDURE
  2007.  
  2008.     sname = ARG(1)
  2009.     def_val = ARG(2)
  2010.     IF ARG() > 2 THEN
  2011.         global_set = ARG(3)
  2012.     ELSE
  2013.         global_set = 0
  2014.     IF ARG() > 3 THEN
  2015.         request_quote = ARG(4)
  2016.     ELSE
  2017.         request_quote = 1
  2018.  
  2019.     val = def_val
  2020.     IF global_set THEN
  2021.         set_fname = 'ENV:'sname
  2022.     ELSE
  2023.         set_fname = 'ENV:PP_AnimChar_'sname
  2024.  
  2025.     IF OPEN('settingfile', set_fname, 'R') THEN DO
  2026.         val = READCH('settingfile', 65535)
  2027.         CALL CLOSE('settingfile')
  2028.     END
  2029.  
  2030.     IF request_quote THEN DO
  2031.         /* encode quotes for the Request command ('"' -> '\""') */
  2032.         qpos_start = 1
  2033.         DO FOREVER
  2034.             qpos = INDEX(val, '"', qpos_start)
  2035.             IF qpos = 0 THEN BREAK
  2036.             val = INSERT('\"', val, qpos-1)
  2037.             qpos_start = qpos + 3
  2038.         END
  2039.     END
  2040.  
  2041.     RETURN val
  2042.  
  2043.  
  2044.  
  2045.  
  2046. Cleanup: PROCEDURE EXPOSE global.
  2047.  
  2048.     IF global.pathdisp THEN DO
  2049.         LockGUI
  2050.         CALL XorPath
  2051.         UnlockGUI
  2052.     END
  2053.  
  2054.     RETURN
  2055.  
  2056.  
  2057.  
  2058.  
  2059. Break_C:
  2060.  
  2061.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  2062.     SetPen 'FOREGROUND' global.xorpen
  2063.     CALL Cleanup
  2064.  
  2065.     LockGUI
  2066.     SetPen 'FOREGROUND' global.savepen
  2067.     SetCurrentBrush global.savebsh
  2068.     SetPaintMode global.savepmode
  2069.     IF global.savebshfr > 1 THEN
  2070.         SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  2071.     Set '"BARS='savebars'"'
  2072.     Set '"GCLIP='saveclip'"'
  2073.     Set '"COORD='savecoord'"'
  2074.     EnableTools
  2075.     UnlockGUI
  2076.  
  2077.     RETURN
  2078.